package main

import "fmt"

//简单来说就是，new 只分配内存，而 make 只能用于 slice、map 和 chan 的初始化

//1、new 是一个内置函数，它会分配一段内存，并返回指向该内存的指针
/*
func new(Type) *Type
从上面的代码可以看出，new 函数只接受一个参数，这个参数是一个类型，并且返回一个指向该类型内存地址的指针。
同时 new 函数会把分配的内存置为零，也就是类型的零值。
*/
func mainnew() {
	p1 := new(int)
	fmt.Printf("new分配的内存 --> %#v \n", p1)    //(*int)(0xc42000e250)
	fmt.Printf("new分配的内存的值 --> %#v \n", *p1) //0
}

//2、make
/*
make 也是用于内存分配的，但是和 new 不同，它只用于 slice、map 和 chan 的内存创建，而且它返回的类型就是这三个类型本身，
而不是他们的指针类型。因为这三种类型本身就是引用类型，所以就没有必要返回他们的指针了
func make(t Type, size ...IntegerType) Type
*/
func main() {
	var s1 []int
	if s1 == nil {
		fmt.Printf("s1 is nil --> %#v \n", s1) // []int(nil)
	}

	s2 := make([]int, 3)
	if s2 == nil {
		fmt.Printf("s2 is nil --> %#v \n", s2)
	} else {
		fmt.Printf("s2 is not nill --> %#v \n", s2) // []int{0, 0, 0}
	}
}

//slice 的零值是 nil，但使用 make 初始化之后，slice 内容被类型 int 的零值填充，如：[]int{0, 0, 0}

/*
总结一下 new 和 make 主要区别如下：
	make 只能用来分配及初始化类型为 slice、map 和 chan 的数据。new 可以分配任意类型的数据；
	new 分配返回的是指针，即类型 *Type。make 返回类型本身，即 Type；
	new 分配的空间被清零。make 分配空间后，会进行初始化；
*/
